# ### 3.局域网存活IP检测
# * 前置知识：subprocess、IP地址处理模块（ipaddress）
# * 输入内容：要检查的网段、子网掩码 (输入：192.168.0.0/24)
# * 输出示例： 192.168.0.1已被使用
# * 将输出结果放到文件
# * 将可能存在异常的地方需要做相应处理
import subprocess
import ipaddress
from pythonping import ping

def ip_info(ip_net):
    """输出ip网段所包含的信息"""
    try:
        net = ipaddress.ip_network(ip_net, strict=False)
        print('IP版本号： ' + str(net.version))
        print('是否是私有地址： ' + str(net.is_private))
        print('IP地址总数: ' + str(net.num_addresses))
        print('可用IP地址总数： ' + str(len([x for x in net.hosts()])))
        print('网络号： ' + str(net.network_address))
        print('广播地址： ' + str(net.broadcast_address))
        print('起始可用IP地址： ' + str([x for x in net.hosts()][0]))
        print('最后可用IP地址： ' + str([x for x in net.hosts()][-1]))
        print('可用IP地址范围： ' + str([x for x in net.hosts()][0]) + ' ~ ' + str([x for x in net.hosts()][-1]))
        print('掩码地址： ' + str(net.netmask))
        print('反掩码地址： ' + str(net.hostmask))
        with open("./test.txt", "w", encoding="utf-8") as fp:
            for x in net.hosts():
                fp.seek(0,2)
                if pingip1(str(x)):
                    print(f"{x}已被使用!")
                    fp.write(f"{x}已被使用!\n")
                else:
                    print(f"{x}未被使用!")
                    fp.write(f"{x}未被使用!\n")
    except ValueError:
        print('您输入格式有误，请检查！')

###方法一:利用subprocess调用shell程序
def pingip(ip):
    # 常用编码
    GBK = 'gbk'
    UTF8 = 'utf-8'

    # 解码方式，一般 py 文件执行为utf-8 ，cmd 命令为 gbk
    current_encoding = GBK

    # 构造popen
    popen = subprocess.Popen('ping '+ip+' -n 3', shell=True,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE,
                             universal_newlines=True,
                             bufsize=1)
    # 执行
    out, err = popen.communicate()
    print('std_out: ' + out)
    print('std_err: ' + err)
    print('returncode: ' + str(popen.returncode))
    return popen.returncode

###方法二 利用python_ping模块直接ping
def pingip1(ip):
	res = ping(f"{ip}",timeout=1,count=1,verbose=False)
	return res.success()

ipnet = input("请输入您想查询的网段:")
ip_info(ipnet)






